This example mirrors layout.html.
In [1]:
from pathlib import Path
from ipyniivue import download_dataset
BASE_API_URL = "https://niivue.com/demos/images/"
DATA_FOLDER = Path("images")
# Download data for example
download_dataset(
BASE_API_URL,
DATA_FOLDER,
files=[
"pcasl.nii.gz",
],
)
pcasl.nii.gz already exists. Dataset downloaded successfully to images.
In [2]:
import ipywidgets as widgets
from ipyniivue import MultiplanarType, NiiVue, ShowRender
# Initialize NiiVue
nv = NiiVue()
nv.opts.show_3d_crosshair = True
nv.opts.back_color = [0.64, 0.76, 0.68, 1]
nv.opts.log_level = "debug"
nv.set_multiplanar_pad_pixels(5)
nv.graph.opacity = 1.0
# Load volume
nv.load_volumes([{"path": DATA_FOLDER / "pcasl.nii.gz"}])
# --- Controls ---
# 1. Smooth (interpolation)
interp_check = widgets.Checkbox(value=True, description="Smooth")
def on_interp_change(change):
"""Handle interpolation change."""
nv.set_interpolation(not change.new)
interp_check.observe(on_interp_change, names="value")
# 2. Resolution (DPI)
dpi_select = widgets.Dropdown(
options=[
("Enable High DPI (best)", 1),
("Disable High DPI", 0),
("DPR = 0.7", 0.7),
("DPR = 0.5", 0.5),
("DPR = 0.3 (worst)", 0.3),
],
value=1,
description="Resolution",
)
def on_dpi_change(change):
"""Handle dpi change."""
val = change.new
if val == 0:
nv.set_high_resolution_capable(-1)
elif val == 1:
nv.set_high_resolution_capable(0)
else:
nv.set_high_resolution_capable(val)
dpi_select.observe(on_dpi_change, names="value")
# 3. Volume render mode
render_mode = widgets.Dropdown(
options=[
("slices", -1),
("matte", 0),
("low", 0.3),
("medium", 0.6),
("high", 1.0),
],
value=0,
description="Volume Render Mode",
)
def on_render_mode_change(change):
"""Handle render mode change."""
nv.set_volume_render_illumination(float(change.new))
render_mode.observe(on_render_mode_change, names="value")
# 4. Timeline
timeline_check = widgets.Checkbox(value=False, description="Timeline")
def on_timeline_change(change):
"""Handle timeline checkbox change."""
nv.graph.auto_size_multiplanar = change.new
timeline_check.observe(on_timeline_change, names="value")
# 5. Padding
pad_slider = widgets.IntSlider(min=0, max=10, value=5, description="Padding")
def on_pad_change(change):
"""Handle pad slider change."""
nv.set_multiplanar_pad_pixels(change.new)
pad_slider.observe(on_pad_change, names="value")
# 6. Layout
layout_select = widgets.Dropdown(
options=[("Auto", 0), ("Column", 1), ("Grid", 2), ("Row", 3)],
value=0,
description="Layout",
)
def on_layout_change(change):
"""Handle layout change."""
nv.opts.multiplanar_layout = MultiplanarType(change.new)
layout_select.observe(on_layout_change, names="value")
# 7. Rendering
rendering_select = widgets.Dropdown(
options=[("Never", 0), ("Always", 1), ("Auto", 2)], value=2, description="Rendering"
)
def on_rendering_change(change):
"""Handle rendering change."""
nv.opts.multiplanar_show_render = ShowRender(change.new)
nv.draw_scene()
rendering_select.observe(on_rendering_change, names="value")
# 8. Hero image
hero_slider = widgets.IntSlider(min=0, max=9, value=0, description="Hero Image")
def on_hero_change(change):
"""Handle hero slider change."""
nv.set_hero_image(change.new * 0.1)
hero_slider.observe(on_hero_change, names="value")
# Display all
ui = widgets.VBox(
[
widgets.HBox([interp_check, dpi_select]),
widgets.HBox([render_mode, timeline_check]),
widgets.HBox([pad_slider, layout_select]),
widgets.HBox([rendering_select, hero_slider]),
nv,
]
)
ui
Out[2]: